package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.services.administracion.MantenimientoCategoriaProd;
import com.sisgesbyte.services.administracion.bean.CategoriaProdBean;
import com.sisgesbyte.services.administracion.bean.CategoriaProdListaResponse;
import com.sisgesbyte.services.proyeccion.ProyeccionZonaPorPeriodoService;
import com.sisgesbyte.services.proyeccion.bean.AvanceProyeccionProductResponse;
import com.sisgesbyte.services.proyeccion.bean.FiltroProductoZonaBean;
import com.sisgesbyte.services.proyeccion.bean.AvanceVentaProductosBean;

@ManagedBean
@ViewScoped
public class ProyeccionZonaProdMBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@EJB
	private ProyeccionZonaPorPeriodoService proyeccionZonaPorPeriodoService;
	@EJB
	private MantenimientoCategoriaProd mantenimientoCategoriaProd;
	@ManagedProperty(value = "#{proyeccionZonasMBean}")
	private ProyeccionZonasMBean proyeccionZonasMBean;
	private List<CategoriaProdBean> listaCategoriaProductos;
	private List<CategoriaProdBean> listaCategoriaPadres;
	private List<CategoriaProdBean> listaCategoriaHijos;
	private String txtBuscar;
	private int idCategoriaProducto;
	private List<AvanceVentaProductosBean> listaProductosZonas;
	private List<AvanceVentaProductosBean> listaProductosZonasTemporal;
	private List<CategoriaProdBean> categoriaHijos;

	@PostConstruct
	public void init() {
		txtBuscar = "";
		cargarCategorias();
		inicializar();
		categoriaHijos = new ArrayList<CategoriaProdBean>();
	}

	public void inicializar() {

		try {
			FiltroProductoZonaBean filtros = new FiltroProductoZonaBean();
			filtros.setIdPeriodo(proyeccionZonasMBean.getPeriodoDefault());
			filtros.setIdZona(proyeccionZonasMBean.getIdZona());
			AvanceProyeccionProductResponse listaProductosZona = proyeccionZonaPorPeriodoService.listaProductosZona(ObtenerIdTransaccion(), filtros);
			this.listaProductosZonas = new ArrayList<AvanceVentaProductosBean>();

			if (listaProductosZona.getCodigoRespuesta().equalsIgnoreCase(
					ConstantesInternasSistema.CODIGO_EXITO)) {
				this.listaProductosZonas = listaProductosZona.getListaProductosZonas();
				//variable temporal para los productos y poder aplicarles filtro
				this.listaProductosZonasTemporal = this.listaProductosZonas;
			} else {
				System.out.println("Error al obtener los productos");
			}

		} catch (Exception e) {
			System.out
					.println("Error al obtener la lista de productos por zona "
							+ e.getMessage());
		}
	}

	public void cargarCategorias() {
		try {

			CategoriaProdListaResponse categorias = mantenimientoCategoriaProd
					.listaCategoriasProducto(ObtenerIdTransaccion(), null);
			listaCategoriaProductos = new ArrayList<CategoriaProdBean>();
			listaCategoriaPadres = new ArrayList<CategoriaProdBean>();
			listaCategoriaHijos = new ArrayList<CategoriaProdBean>();
			for (CategoriaProdBean ls : categorias.getListaCategoriaProductos()) {
				if (ls.getPadre_id() == 0) {
					listaCategoriaPadres.add(ls);
				} else {
					listaCategoriaHijos.add(ls);
				}
			}

			for (CategoriaProdBean ls : listaCategoriaPadres) {
				listaCategoriaProductos.add(ls);
				mostrarHijos(ls.getId());
			}
		} catch (Exception e) {
			System.out.println("Error al cargar las categorias: " + e);
		}
	}

	// metodo para obtener la estructura de hijos de una categoria
	public void mostrarHijos(int padreId) {

		for (CategoriaProdBean ls : listaCategoriaHijos) {
			if (padreId == ls.getPadre_id()) {
				listaCategoriaProductos.add(ls);
				mostrarHijos(ls.getId());
			}
		}
	}

	public void obtenerCategoriaHijos(int idPadre) {

		for (CategoriaProdBean ls : listaCategoriaProductos) {
			if (idPadre == ls.getPadre_id()) {
				categoriaHijos.add(ls);
				obtenerCategoriaHijos(ls.getId());
			}
		}
	}

	public String ObtenerIdTransaccion() {
		String sessionId = "";
		try {
			FacesContext fCtx = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) fCtx.getExternalContext()
					.getSession(false);
			sessionId = session.getId().replace(".undefined", "");
		} catch (Exception e) {
			sessionId = "Error";
			System.out.println("Error al obtener Session" + e);
		}

		return sessionId;
	}

	public void crearFiltro() {
		categoriaHijos = new ArrayList<CategoriaProdBean>();
		this.listaProductosZonasTemporal = new ArrayList<AvanceVentaProductosBean>();

			// buscamos al padre
			for (CategoriaProdBean ls : listaCategoriaProductos) {
				if (idCategoriaProducto == ls.getId()) {
					categoriaHijos.add(ls);
				}
			}
			// buscamos los hijos
			obtenerCategoriaHijos(idCategoriaProducto);

			// recorremos las categorias
			for (CategoriaProdBean cat : categoriaHijos) {
				// buscamos los productos por categoria
				for (AvanceVentaProductosBean prod : listaProductosZonas) {
					if (prod.getCategoriaProductoId() == cat.getId() && (prod.getMarca()+ " / " + prod.getProducto() + " / " + prod.getCodProd()).toLowerCase().contains(txtBuscar.toLowerCase().trim())) {
						this.listaProductosZonasTemporal.add(prod);
					}
				}
			}
	}

	public List<CategoriaProdBean> getListaCategoriaProductos() {
		return listaCategoriaProductos;
	}

	public void setListaCategoriaProductos(
			List<CategoriaProdBean> listaCategoriaProductos) {
		this.listaCategoriaProductos = listaCategoriaProductos;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	public int getIdCategoriaProducto() {
		return idCategoriaProducto;
	}

	public void setIdCategoriaProducto(int idCategoriaProducto) {
		this.idCategoriaProducto = idCategoriaProducto;
	}

	public ProyeccionZonasMBean getProyeccionZonasMBean() {
		return proyeccionZonasMBean;
	}

	public void setProyeccionZonasMBean(
			ProyeccionZonasMBean proyeccionZonasMBean) {
		this.proyeccionZonasMBean = proyeccionZonasMBean;
	}

	public List<AvanceVentaProductosBean> getListaProductosZonas() {
		return listaProductosZonas;
	}

	public void setListaProductosZonas(
			List<AvanceVentaProductosBean> listaProductosZonas) {
		this.listaProductosZonas = listaProductosZonas;
	}

	public List<AvanceVentaProductosBean> getListaProductosZonasTemporal() {
		return listaProductosZonasTemporal;
	}

	public void setListaProductosZonasTemporal(
			List<AvanceVentaProductosBean> listaProductosZonasTemporal) {
		this.listaProductosZonasTemporal = listaProductosZonasTemporal;
	}


}
